home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / hplip / sendfax.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2009-10-28  |  14KB  |  462 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __version__ = '9.0'
  5. __title__ = 'PC Sendfax Utility'
  6. __mod__ = 'hp-sendfax'
  7. __doc__ = 'PC send fax for HPLIP supported multifunction printers.'
  8. import sys
  9. import os
  10. import os.path as os
  11. import getopt
  12. import signal
  13. import time
  14. import operator
  15. from base.g import *
  16. import base.utils as utils
  17. from base import device, tui, module
  18. username = prop.username
  19. faxnum_list = []
  20. recipient_list = []
  21. group_list = []
  22. prettyprint = False
  23. mod = module.Module(__mod__, __title__, __version__, __doc__, None, (GUI_MODE, NON_INTERACTIVE_MODE), (UI_TOOLKIT_QT3, UI_TOOLKIT_QT4))
  24. mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS | module.USAGE_FLAG_SUPRESS_G_DEBUG_FLAG, extra_options = [
  25.     ('Specify the fax number(s):', '-f<number(s)> or --faxnum=<number(s)> or --fax-num=<number(s)>  or --num=<number(s)>(-n only)', 'option', False),
  26.     ('Specify the recipient(s):', '-r<recipient(s)> or --recipient=<recipient(s)> (-n only)', 'option', False),
  27.     ('Specify the groups(s):', '--group=<group(s)> or --groups=<group(s)> (-n only)', 'option', False)], see_also_list = [
  28.     'hp-faxsetup',
  29.     'hp-fab'])
  30. (opts, device_uri, printer_name, mode, ui_toolkit, loc) = mod.parseStdOpts('f:r:g:', [
  31.     'faxnum=',
  32.     'fax-num=',
  33.     'recipient=',
  34.     'group=',
  35.     'groups=',
  36.     'gg'], supress_g_debug_flag = True)
  37. for o, a in opts:
  38.     if o == '--gg':
  39.         log.set_level('debug')
  40.         continue
  41.     if o in ('-z', '--logfile'):
  42.         log.set_logfile(a)
  43.         log.set_where(log.LOG_TO_CONSOLE_AND_FILE)
  44.         continue
  45.     if o == '--fax':
  46.         printer_name = a
  47.         continue
  48.     if o in ('-f', '--faxnum', '--fax-num', '--num'):
  49.         faxnum_list.extend(a.split(','))
  50.         continue
  51.     if o in ('-r', '--recipient'):
  52.         recipient_list.extend(a.split(','))
  53.         continue
  54.     if o in ('-g', '--group'):
  55.         group_list.extend(a.split(','))
  56.         continue
  57.  
  58. if not prop.fax_build:
  59.     log.error('Fax is disabled (turned off during build). Exiting')
  60.     sys.exit(1)
  61.  
  62. (printer_name, device_uri) = mod.getPrinterName(printer_name, device_uri, filter = {
  63.     'fax-type': (operator.gt, 0) }, back_end_filter = [
  64.     'hpfax'])
  65. if mode == GUI_MODE:
  66.     if ui_toolkit == 'qt3':
  67.         if not utils.canEnterGUIMode():
  68.             log.error('%s requires GUI support (try running with --qt4). Also, try using non-interactive (-n) mode.' % __mod__)
  69.             sys.exit(1)
  70.         
  71.     elif not utils.canEnterGUIMode4():
  72.         log.error('%s requires GUI support (try running with --qt3). Also, try using non-interactive (-n) mode.' % __mod__)
  73.         sys.exit(1)
  74.     
  75.  
  76. if mode == GUI_MODE:
  77.     if ui_toolkit == 'qt3':
  78.         app = None
  79.         sendfax = None
  80.         
  81.         try:
  82.             from qt import *
  83.             from ui.faxsendjobform import FaxSendJobForm
  84.         except ImportError:
  85.             log.error('Unable to load Qt3 support. Is it installed?')
  86.             sys.exit(1)
  87.  
  88.         app = QApplication(sys.argv)
  89.         if loc is None:
  90.             loc = user_conf.get('ui', 'loc', 'system')
  91.             if loc.lower() == 'system':
  92.                 loc = str(QTextCodec.locale())
  93.                 log.debug('Using system locale: %s' % loc)
  94.             
  95.         
  96.         if loc.lower() != 'c':
  97.             e = 'utf8'
  98.             
  99.             try:
  100.                 (l, x) = loc.split('.')
  101.                 loc = '.'.join([
  102.                     l,
  103.                     e])
  104.             except ValueError:
  105.                 l = loc
  106.                 loc = '.'.join([
  107.                     loc,
  108.                     e])
  109.  
  110.             log.debug('Trying to load .qm file for %s locale.' % loc)
  111.             trans = QTranslator(None)
  112.             qm_file = 'hplip_%s.qm' % l
  113.             log.debug('Name of .qm file: %s' % qm_file)
  114.             loaded = trans.load(qm_file, prop.localization_dir)
  115.             if loaded:
  116.                 app.installTranslator(trans)
  117.             else:
  118.                 loc = 'c'
  119.         
  120.         if loc == 'c':
  121.             log.debug("Using default 'C' locale")
  122.         else:
  123.             log.debug('Using locale: %s' % loc)
  124.             QLocale.setDefault(QLocale(loc))
  125.             prop.locale = loc
  126.             
  127.             try:
  128.                 locale.setlocale(locale.LC_ALL, locale.normalize(loc))
  129.             except locale.Error:
  130.                 pass
  131.  
  132.         if os.geteuid() == 0:
  133.             log.error('You must not be root to run this utility.')
  134.             QMessageBox.critical(None, 'HP Device Manager - Send Fax', 'You must not be root to run hp-sendfax.', QMessageBox.Ok, QMessageBox.NoButton, QMessageBox.NoButton)
  135.             sys.exit(1)
  136.         
  137.         sendfax = FaxSendJobForm(device_uri, printer_name, mod.args)
  138.         app.setMainWidget(sendfax)
  139.         pid = os.getpid()
  140.         log.debug('pid=%d' % pid)
  141.         sendfax.show()
  142.         
  143.         try:
  144.             log.debug('Starting GUI loop...')
  145.             app.exec_loop()
  146.         except KeyboardInterrupt:
  147.             pass
  148.         except:
  149.             None<EXCEPTION MATCH>KeyboardInterrupt
  150.         
  151.  
  152.     None<EXCEPTION MATCH>KeyboardInterrupt
  153.     from PyQt4.QtGui import QApplication
  154.     from ui4.sendfaxdialog import SendFaxDialog
  155.     app = QApplication(sys.argv)
  156.     dlg = SendFaxDialog(None, printer_name, device_uri, mod.args)
  157.     dlg.show()
  158.     
  159.     try:
  160.         log.debug('Starting GUI loop...')
  161.         app.exec_()
  162.     except KeyboardInterrupt:
  163.         sys.exit(0)
  164.     except:
  165.         None<EXCEPTION MATCH>KeyboardInterrupt
  166.     
  167.  
  168. None<EXCEPTION MATCH>KeyboardInterrupt
  169. if os.getuid() == 0:
  170.     log.error('%s cannot be run as root.' % __mod__)
  171.     sys.exit(1)
  172.  
  173.  
  174. try:
  175.     import struct
  176.     import Queue
  177.     from prnt import cups
  178.     from base import magic
  179.     
  180.     try:
  181.         from fax import fax
  182.     except ImportError:
  183.         log.error('Fax address book disabled - Python 2.3+ required.')
  184.         sys.exit(1)
  185.  
  186.     db = fax.FaxAddressBook()
  187.     
  188.     try:
  189.         import dbus
  190.     except ImportError:
  191.         log.error('PC send fax requires dBus and python-dbus')
  192.         sys.exit(1)
  193.  
  194.     import warnings
  195.     warnings.simplefilter('ignore', DeprecationWarning)
  196.     (dbus_avail, service, session_bus) = device.init_dbus()
  197.     if not dbus_avail or service is None:
  198.         log.error('Unable to initialize dBus. PC send fax requires dBus and hp-systray support. Exiting.')
  199.         sys.exit(1)
  200.     
  201.     phone_num_list = []
  202.     log.debug('Faxnum list = %s' % faxnum_list)
  203.     faxnum_list = utils.uniqueList(faxnum_list)
  204.     log.debug('Unique list=%s' % faxnum_list)
  205.     for f in faxnum_list:
  206.         for c in f:
  207.             if c not in '0123456789-(+) *#':
  208.                 log.error("Invalid character in fax number '%s'. Only the characters '0123456789-(+) *#' are valid." % f)
  209.                 sys.exit(1)
  210.                 continue
  211.         
  212.     
  213.     log.debug('Group list = %s' % group_list)
  214.     group_list = utils.uniqueList(group_list)
  215.     log.debug('Unique list=%s' % group_list)
  216.     for g in group_list:
  217.         entries = db.group_members(g)
  218.         if not entries:
  219.             log.warn('Unknown group name: %s' % g)
  220.             continue
  221.         for e in entries:
  222.             recipient_list.append(e)
  223.         
  224.     
  225.     log.debug('Recipient list = %s' % recipient_list)
  226.     recipient_list = utils.uniqueList(recipient_list)
  227.     log.debug('Unique list=%s' % recipient_list)
  228.     for r in recipient_list:
  229.         if db.get(r) is None:
  230.             log.error("Unknown fax recipient '%s' in the recipient list." % r)
  231.             all_entries = db.get_all_records()
  232.             log.info(log.bold('\nKnown recipients (entries):'))
  233.             for a in all_entries:
  234.                 aa = db.get(a)
  235.                 log.info('%s (fax number: %s)' % (a, aa['fax']))
  236.             
  237.             print 
  238.             sys.exit(1)
  239.             continue
  240.     
  241.     for p in recipient_list:
  242.         a = db.get(p)
  243.         if a['fax']:
  244.             phone_num_list.append(a)
  245.             log.debug('Name=%s Number=%s' % (a['name'], a['fax']))
  246.             continue
  247.     
  248.     for p in faxnum_list:
  249.         phone_num_list.append({
  250.             'fax': p,
  251.             'name': u'Unknown' })
  252.         log.debug('Number=%s' % p)
  253.     
  254.     log.debug('Phone num list = %s' % phone_num_list)
  255.     if not phone_num_list:
  256.         mod.usage(error_msg = [
  257.             'No recipients specified. Please use -f, -r, and/or -g to specify recipients.'])
  258.     
  259.     allowable_mime_types = cups.getAllowableMIMETypes()
  260.     for f in mod.args:
  261.         path = os.path.realpath(f)
  262.         log.debug(path)
  263.         if os.path.exists(path):
  264.             mime_type = magic.mime_type(path)
  265.             log.debug(mime_type)
  266.         else:
  267.             log.error("File '%s' does not exist." % path)
  268.             sys.exit(1)
  269.         if mime_type not in allowable_mime_types:
  270.             log.error("File '%s' has a non-allowed mime-type of '%s'" % (path, mime_type))
  271.             sys.exit(1)
  272.             continue
  273.     
  274.     log.info(log.bold('Using fax %s (%s)' % (printer_name, device_uri)))
  275.     mod.lockInstance(printer_name)
  276.     
  277.     try:
  278.         ppd_file = cups.getPPD(printer_name)
  279.         if ppd_file is not None and os.path.exists(ppd_file):
  280.             if file(ppd_file, 'r').read(8192).find('HP Fax') == -1:
  281.                 log.error("Fax configuration error. The CUPS fax queue for '%s' is incorrectly configured. Please make sure that the CUPS fax queue is configured with the 'HP Fax' Model/Driver." % printer_name)
  282.                 sys.exit(1)
  283.             
  284.         
  285.         if not mod.args:
  286.             mod.usage(error_msg = [
  287.                 'No files specfied to send. Please specify the file(s) to send on the command line.'])
  288.         
  289.         file_list = []
  290.         for f in mod.args:
  291.             path = os.path.realpath(f)
  292.             log.debug(path)
  293.             mime_type = magic.mime_type(path)
  294.             if mime_type == 'application/hplip-fax':
  295.                 log.info('\nPreparing fax file %s...' % f)
  296.                 fax_file_fd = file(f, 'r')
  297.                 header = fax_file_fd.read(fax.FILE_HEADER_SIZE)
  298.                 fax_file_fd.close()
  299.                 (mg, version, pages, hort_dpi, vert_dpi, page_size, resolution, encoding, reserved1, reserved2) = struct.unpack('>8sBIHHBBBII', header)
  300.                 if mg != 'hplip_g3':
  301.                     log.error('%s: Invalid file header. Bad magic.' % f)
  302.                     sys.exit(1)
  303.                 
  304.                 file_list.append((f, mime_type, '', '', pages))
  305.                 continue
  306.             all_pages = True
  307.             page_range = ''
  308.             page_set = 0
  309.             nup = 1
  310.             cups.resetOptions()
  311.             if mime_type in ('application/x-cshell', 'application/x-perl', 'application/x-python', 'application/x-shell', 'text/plain') and prettyprint:
  312.                 cups.addOption('prettyprint')
  313.             
  314.             if nup > 1:
  315.                 cups.addOption('number-up=%d' % nup)
  316.             
  317.             while True:
  318.                 cups_printers = cups.getPrinters()
  319.                 printer_state = cups.IPP_PRINTER_STATE_STOPPED
  320.                 for p in cups_printers:
  321.                     if p.name == printer_name:
  322.                         printer_state = p.state
  323.                         continue
  324.                 
  325.                 log.debug('Printer state = %d' % printer_state)
  326.                 if printer_state == cups.IPP_PRINTER_STATE_IDLE:
  327.                     log.debug('Printer name = %s file = %s' % (printer_name, path))
  328.                     sent_job_id = cups.printFile(printer_name, path, os.path.basename(path))
  329.                     log.info("\nRendering file '%s' (job %d)..." % (path, sent_job_id))
  330.                     log.debug('Job ID=%d' % sent_job_id)
  331.                     break
  332.                     continue
  333.                 if printer_state == cups.IPP_PRINTER_STATE_PROCESSING:
  334.                     log.debug("Waiting for CUPS queue '%s' to become idle." % printer_name)
  335.                     continue
  336.                 log.error("The CUPS queue for '%s' is in a stopped or busy state (%d). Please check the queue and try again." % (printer_name, printer_state))
  337.                 sys.exit(1)
  338.             cups.resetOptions()
  339.             end_time = time.time() + 120
  340.             while time.time() < end_time:
  341.                 log.debug('Waiting for fax...')
  342.                 
  343.                 try:
  344.                     result = list(service.CheckForWaitingFax(device_uri, prop.username, sent_job_id))
  345.                     log.debug(repr(result))
  346.                 except dbus.exceptions.DBusException:
  347.                     log.error('Cannot communicate with hp-systray. Canceling...')
  348.                     cups.cancelJob(sent_job_id)
  349.                     sys.exit(1)
  350.  
  351.                 fax_file = str(result[7])
  352.                 log.info(fax_file)
  353.                 if fax_file:
  354.                     log.debug('Fax file=%s' % fax_file)
  355.                     title = str(result[5])
  356.                     break
  357.                 
  358.                 time.sleep(1)
  359.             log.error('Timeout waiting for rendering. Canceling job #%d...' % sent_job_id)
  360.             cups.cancelJob(sent_job_id)
  361.             sys.exit(1)
  362.             f = file(fax_file, 'r')
  363.             header = f.read(fax.FILE_HEADER_SIZE)
  364.             if len(header) != fax.FILE_HEADER_SIZE:
  365.                 log.error('Invalid fax file! (truncated header or no data)')
  366.                 sys.exit(1)
  367.             
  368.             (mg, version, total_pages, hort_dpi, vert_dpi, page_size, resolution, encoding, reserved1, reserved2) = struct.unpack('>8sBIHHBBBII', header[:fax.FILE_HEADER_SIZE])
  369.             log.debug('Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%d' % (mg, version, total_pages, hort_dpi, vert_dpi, page_size, resolution, encoding))
  370.             file_list.append((fax_file, mime_type, '', title, total_pages))
  371.             f.close()
  372.         
  373.         dev = None
  374.         log.debug('\nChecking device state...')
  375.         
  376.         try:
  377.             dev = fax.getFaxDevice(device_uri, printer_name)
  378.             
  379.             try:
  380.                 dev.open()
  381.             except Error:
  382.                 e = None
  383.                 log.warn(e.msg)
  384.  
  385.             
  386.             try:
  387.                 dev.queryDevice(quick = True)
  388.             except Error:
  389.                 e = None
  390.                 log.error('Query device error (%s).' % e.msg)
  391.                 dev.error_state = ERROR_STATE_ERROR
  392.  
  393.             if dev.error_state > ERROR_STATE_MAX_OK and dev.error_state not in (ERROR_STATE_LOW_SUPPLIES, ERROR_STATE_LOW_PAPER):
  394.                 log.error('Device is busy or in an error state (code=%d). Please wait for the device to become idle or clear the error and try again.' % dev.error_state)
  395.                 sys.exit(1)
  396.             
  397.             user_conf.set('last_used', 'device_uri', dev.device_uri)
  398.             log.debug('File list:')
  399.             for f in file_list:
  400.                 log.debug(str(f))
  401.             
  402.             service.SendEvent(device_uri, printer_name, EVENT_START_FAX_JOB, prop.username, 0, '')
  403.             update_queue = Queue.Queue()
  404.             event_queue = Queue.Queue()
  405.             log.info('\nSending fax...')
  406.             if not dev.sendFaxes(phone_num_list, file_list, '', '', None, False, printer_name, update_queue, event_queue):
  407.                 log.error('Send fax is active. Please wait for operation to complete.')
  408.                 service.SendEvent(device_uri, printer_name, EVENT_FAX_JOB_FAIL, prop.username, 0, '')
  409.                 sys.exit(1)
  410.             
  411.             
  412.             try:
  413.                 cont = True
  414.                 while cont:
  415.                     while update_queue.qsize():
  416.                         
  417.                         try:
  418.                             (status, page_num, phone_num) = update_queue.get(0)
  419.                         except Queue.Empty:
  420.                             break
  421.  
  422.                         if status == fax.STATUS_IDLE:
  423.                             log.debug('Idle')
  424.                             continue
  425.                         if status == fax.STATUS_PROCESSING_FILES:
  426.                             log.info('\nProcessing page %d' % page_num)
  427.                             continue
  428.                         if status == fax.STATUS_DIALING:
  429.                             log.info('\nDialing %s...' % phone_num)
  430.                             continue
  431.                         if status == fax.STATUS_CONNECTING:
  432.                             log.info('\nConnecting to %s...' % phone_num)
  433.                             continue
  434.                         if status == fax.STATUS_SENDING:
  435.                             log.info('\nSending page %d to %s...' % (page_num, phone_num))
  436.                             continue
  437.                         None if status == fax.STATUS_CLEANUP else status == fax.STATUS_ERROR
  438.                     update_spinner()
  439.                     time.sleep(2)
  440.                 cleanup_spinner()
  441.             except KeyboardInterrupt:
  442.                 event_queue.put((fax.EVENT_FAX_SEND_CANCELED, '', '', ''))
  443.                 service.SendEvent(device_uri, printer_name, EVENT_FAX_JOB_CANCELED, prop.username, 0, '')
  444.                 log.error('Cancelling...')
  445.  
  446.         finally:
  447.             log.debug('Waiting for send fax thread to exit...')
  448.             if dev is not None:
  449.                 dev.waitForSendFaxThread()
  450.                 log.debug('Closing device...')
  451.                 dev.close()
  452.             
  453.  
  454.     finally:
  455.         mod.unlockInstance()
  456.  
  457. except KeyboardInterrupt:
  458.     log.error('User exit')
  459.  
  460. log.info('')
  461. log.info('Done.')
  462.